#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
项目结构重构脚本
将 uni-app 3.0 项目文件移动到 src 目录
"""

import os
import shutil
import json
from pathlib import Path

# 需要移动到 src 的目录和文件
SRC_DIRS = [
    'pages',
    'components',
    'static',
    'stores',
    'utils',
    'api',
    'config'
]

SRC_FILES = [
    'App.vue',
    'main.js',
    'pages.json',
    'manifest.json',
    'uni.scss',
    'index.html'
]

# 保留在根目录的文件和目录
ROOT_KEEP = [
    'package.json',
    'vite.config.js',
    'tsconfig.json',
    '.gitignore',
    'pnpm-lock.yaml',
    'node_modules',
    '.cursor',
    'src',
    'restructure.py'
]

def ensure_dir(path):
    """确保目录存在"""
    os.makedirs(path, exist_ok=True)

def copy_file_or_dir(src, dst):
    """复制文件或目录"""
    if os.path.exists(src):
        ensure_dir(os.path.dirname(dst) if os.path.isfile(src) else dst)
        if os.path.exists(dst):
            print(f"  警告: {dst} 已存在，将被覆盖")
            if os.path.isdir(dst):
                shutil.rmtree(dst)
            else:
                os.remove(dst)
        
        if os.path.isdir(src):
            shutil.copytree(src, dst)
        else:
            shutil.copy2(src, dst)
        print(f"  ✓ 复制: {src} -> {dst}")
        return True
    else:
        print(f"  ✗ 未找到: {src}")
        return False

def move_file_or_dir(src, dst):
    """移动文件或目录（如果目标不存在）"""
    if os.path.exists(src):
        # 如果目标已存在，先删除
        if os.path.exists(dst):
            print(f"  跳过: {dst} 已存在")
            return False
        
        ensure_dir(os.path.dirname(dst) if os.path.isfile(src) else dst)
        shutil.move(src, dst)
        print(f"  ✓ 移动: {src} -> {dst}")
        return True
    else:
        print(f"  ✗ 未找到: {src}")
        return False

def update_file_content(file_path, replacements):
    """更新文件内容"""
    if not os.path.exists(file_path):
        return False
    
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        updated = False
        for old, new in replacements.items():
            if old in content:
                content = content.replace(old, new)
                updated = True
        
        if updated:
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(content)
            print(f"  ✓ 更新: {file_path}")
        
        return updated
    except Exception as e:
        print(f"  ✗ 更新失败 {file_path}: {e}")
        return False

def main():
    """主函数"""
    print("=" * 60)
    print("开始重构项目结构...")
    print("=" * 60)
    
    project_root = Path(__file__).parent.absolute()
    src_dir = project_root / 'src'
    
    # 创建 src 目录
    ensure_dir(src_dir)
    print(f"\n✓ 创建目录: {src_dir}")
    
    # 移动目录到 src（如果目标不存在）
    print("\n移动目录到 src:")
    for dir_name in SRC_DIRS:
        src_path = project_root / dir_name
        dst_path = src_dir / dir_name
        if src_path.exists() and not dst_path.exists():
            move_file_or_dir(str(src_path), str(dst_path))
        elif dst_path.exists():
            print(f"  跳过: {dst_path} 已存在")
    
    # 移动文件到 src（如果目标不存在）
    print("\n移动文件到 src:")
    for file_name in SRC_FILES:
        src_path = project_root / file_name
        dst_path = src_dir / file_name
        if src_path.exists() and not dst_path.exists():
            move_file_or_dir(str(src_path), str(dst_path))
        elif dst_path.exists():
            print(f"  跳过: {dst_path} 已存在")
    
    # 更新 index.html 中的 main.js 路径
    print("\n更新配置文件路径引用:")
    index_html = src_dir / 'index.html'
    if index_html.exists():
        replacements = {
            'src="/main.js"': 'src="/src/main.js"'
        }
        update_file_content(str(index_html), replacements)
    
    print("\n" + "=" * 60)
    print("项目结构重构完成！")
    print("=" * 60)
    print("\n新的项目结构:")
    print("src/")
    print("  ├── pages/")
    print("  ├── components/")
    print("  ├── static/")
    print("  ├── stores/")
    print("  ├── utils/")
    print("  ├── api/")
    print("  ├── config/")
    print("  ├── App.vue")
    print("  ├── main.js")
    print("  ├── pages.json")
    print("  ├── manifest.json")
    print("  ├── uni.scss")
    print("  └── index.html")
    print("\n根目录保留:")
    print("  ├── package.json")
    print("  ├── vite.config.js")
    print("  ├── tsconfig.json")
    print("  └── .gitignore")
    print("\n注意: 请手动删除根目录下的旧文件（如果已复制到 src）")

if __name__ == '__main__':
    main()

